//===============================================================================
// Microsoft patterns & practices
// Smart Client Software Factory 2010
//===============================================================================
// Copyright (c) Microsoft Corporation.  All rights reserved.
// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY
// OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT
// LIMITED TO THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
// FITNESS FOR A PARTICULAR PURPOSE.
//===============================================================================
// The example companies, organizations, products, domain names,
// e-mail addresses, logos, people, places, and events depicted
// herein are fictitious.  No association with any real company,
// organization, product, domain name, email address, logo, person,
// places, or events is intended or should be inferred.
//===============================================================================
//----------------------------------------------------------------------------------------
// patterns & practices - Smart Client Software Factory - Guidance Package
//
// This file was generated by this guidance package as part of the solution template
//
// The ServiceProxy class provides a base class for proxies generated with the Add Smart Web Reference recipe
// 
// For more information see: 
// ms-help://MS.VSCC.v80/MS.VSIPCC.v80/ms.scsf.2006jun/SCSF/html/03-210-Creating%20a%20Smart%20Client%20Solution.htm
// ms-help://MS.VSCC.v80/MS.VSIPCC.v80/ms.scsf.2006jun/SCSF/html/03-340-Automation%20%20Add%20Smart%20Web%20Reference%20Recipe.htm
//
// Latest version of this Guidance Package: http://go.microsoft.com/fwlink/?LinkId=62182
//----------------------------------------------------------------------------------------


using System;
using System.Threading;
using Microsoft.Practices.QuickStarts.WPFIntegration.Infrastructure.Interface.Commands;

namespace Microsoft.Practices.QuickStarts.WPFIntegration.Infrastructure.Interface
{
    public abstract class ServiceProxy<TService>
        where TService : ISupportsTimeout
    {
        private CommandQueue _queue = new CommandQueue();
        private ManualResetEvent _shutdownEvent = new ManualResetEvent(false);
        private TService _service;
        private Thread _thread;

        protected TService Service
        {
            get { return _service; }
        }

        protected CommandQueue Queue
        {
            get { return _queue; }
        }

        protected ServiceProxy(TService service)
        {
            _service = service;
            _thread = new Thread(ThreadHandler);
            _thread.IsBackground = true;
            _thread.Start();
        }

        ~ServiceProxy()
        {
            Dispose(false);
        }

        public void Dispose()
        {
            Dispose(true);
            GC.SuppressFinalize(this);
        }

        protected virtual void Dispose(bool disposing)
        {
            if (disposing)
            {
                _shutdownEvent.Set();
                _thread.Join();
            }
        }

        private void ThreadHandler()
        {
            WaitHandle[] waitHandles = new WaitHandle[] { _shutdownEvent, _queue.NewCommandWaitHandle };

            while (WaitHandle.WaitAny(waitHandles) != 0)
                _queue.Run();
        }
    }
}
